package cn.zymall.common.controller.fileup;

import cn.zymall.common.feign.fastFile.FastFileFeign;
import cn.zymall.common.utils.oss.OSSField;
import com.aliyun.oss.HttpMethod;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;

import com.aliyun.oss.model.GeneratePresignedUrlRequest;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.*;
import java.net.URL;
import java.util.Date;
import java.util.UUID;

/**
 * @author xuxianda
 * @Description: 文件上传公共类
 * @date 2020/8/18 15:03
 * @Copyright
 * @return
 **/

public class BaseFileUpLoadController {

    @Autowired
    FastFileFeign fastFileFeign;

    /**
     * 使用自研的分布式文件系统 FastFileSystem
     * GitLab: http://xxd/group-one/fast-file-system.git
     *
     * @param file
     * @return
     */
    @PostMapping("/upload")
    public String uploadByFastFile(@RequestParam("file") MultipartFile file) {
        if (file.isEmpty()) {
            return "文件是空的";
        }
        if ((file.getSize() / 1024) > 1024) {
            return "文件最大限制为1MB";
        }
        System.out.println("图片：---"+file);
        return fastFileFeign.uploadMethod(file);
    }


    /**
     * 阿里对象OSS 文件上传   已废弃
     * 用法：创建一个控制器，继承这个类，根据路径映射到该方法
     *
     * @return String 返回图片地址
     */
    @Deprecated
    public String uploadByOss() {
        return uploadByOss();
    }

    /**
     * 阿里对象OSS 文件上传   已废弃
     * 用法：创建一个控制器，继承这个类，根据路径映射到该方法
     *
     * @param file
     * @return String 返回图片地址
     */
    @Deprecated
    public String uploadByOss(MultipartFile file) {
        // <yourObjectName>上传文件到OSS时需要指定包含文件后缀在内的完整路径，例如abc/efg/123.jpg。
        String objectName = "img/" + UUID.randomUUID() + file.getOriginalFilename();
        // 创建OSSClient实例。
        System.out.println(objectName);
        OSS ossClient = new OSSClientBuilder().build(OSSField.ENDPOINT, OSSField.ACCESS_KEY_ID, OSSField.ACCESS_KEY_SECRET);
        boolean b = ossClient.doesBucketExist(OSSField.BUCKET_NAME);//判断存储是否存在
        System.out.println(b);
        //创建源与目的地
        byte[] dest = null;//最后在内存中形成的字节数组(目的地)
        //选择流
        InputStream is = null;//此流是文件到程序的输入流
        ByteArrayOutputStream baos = null;//此流是程序到新文件的输出流
        //操作(输入操作)
        try {
            is = file.getInputStream();//文件输入流
            baos = new ByteArrayOutputStream();//字节输出流，不需要指定文件，内存中存在
            byte[] flush = new byte[1024 * 10];//设置缓冲，这样便于传输，大大提高传输效率
            int len = -1;//设置每次传输的个数,若没有缓冲的数据大，则返回剩下的数据，没有数据返回-1
            while ((len = is.read(flush)) != -1) {
                baos.write(flush, 0, len);//每次读取len长度数据后，将其写出
            }
            baos.flush();//刷新管道数据
            dest = baos.toByteArray();//最终获得的字节数组
            // 上传内容到指定的存储空间（bucketName）并保存为指定的文件名称（objectName）。
            //String content = "Hello OSS";
            ossClient.putObject(OSSField.BUCKET_NAME, objectName, new ByteArrayInputStream(baos.toByteArray()));
            // 关闭OSSClient。
            ossClient.shutdown();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (null != is) {
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        Date expiration = new Date(System.currentTimeMillis() + 3600 * 1000);
        GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(OSSField.BUCKET_NAME, objectName, HttpMethod.GET);
        request.setExpiration(expiration);
        URL signedUrl = ossClient.generatePresignedUrl(request);
        System.out.println(signedUrl);
        return signedUrl + "";
    }

}
